﻿#ifndef TASK_H
#define TASK_H
#define RESOURCE_MAX 10
#include "core.h"
#include <stdint.h>
#include <vector>
using namespace std;

//任务队列节点
typedef struct __task_queue_node task_queue_node;

typedef struct core_domain Core;
typedef struct global_domain Cluster;


/**
 * @brief 任务每一个分段在哪个核心上，长度是多少，开始和截至时间是多少
 *
 */

struct subsection{
    uint32_t part_on_core[100];
    uint32_t part_length[100];
    uint32_t start[100];
    uint32_t end[100];

};


struct task_struct{
    uint32_t resource_type[RESOURCE_MAX];   //共享资源
    uint32_t resource_duration[RESOURCE_MAX]; //共享资源最大访问时间
    uint32_t resource_on_core[RESOURCE_MAX]; //共享资源所处核
    uint32_t resource_times[RESOURCE_MAX];
    uint32_t resource_start[RESOURCE_MAX];      //共享资源访问时间
    bool resource_isglobal[RESOURCE_MAX];
    bool access=false;
    uint32_t resource_index;  //访问第几段共享资源
    int task_id;
    int task_priority; //此处假定数值越小，优先级越高
    int task_jitter; //任务释放抖动
    int task_wcet;  //单位速率处理器上的最坏执行时间
    int task_wcrt;
    int task_period;
    int task_deadline;
    bool get_resource;
    struct subsection partition;
    int on_core; //所在核
    int temp_core; //访问资源时当前所在核
    int arrival_time; //任务实例的释放时间
    int ready_time; //任务实例的就绪时间
    int execute_time; //任务实例已经执行的时间
    bool isRestart; //周期任务在本周期内是否执行过了
    bool isArrived; //任务实例在本轮中是否已经释放
    bool first_release; //判断是否初次执行，便于展示任务名称信息
   int num_subsection;  // 分段数量
    int joined_row;
    int owner_cluster; //任务分配的集群
    int task_type;                   //0为表调度任务 1为硬实时 2为软实时  -1为被拒绝任务
    bool isAccessControl;
    bool isExcuted;
};
typedef struct task_struct Task;


bool is_in_task_list(Task *cur, task_queue_node *head);

bool isExit(Task *current);

bool isTaskArrival(int time, Task *task);

bool isOnCore(Task *task, Core *core);

void enqueue_wait_for_join(Task *task);

void dequeue_wait_for_join(Task *task);

void initTask(int id, struct subsection partition,int peroid,int num_subscetion,int task_type);

void initAccessControl(int id, struct subsection partition,int peroid,int num_subscetion,int task_type);

void initMRTSTask(int id, int type, int prior, int jitter, int wcet, int period, int ddl, int arrival_time, int on_core, int joined_row);

int get_tasknum();

void taskset_delet(Task *task);
#endif // TASK_H

